﻿using LanguagePolish.EntityModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LanguagePolish.Models
{
    class StudentsModel
    {
        public bool CanUserAddStudents
        {
            get
            {
                return LinksProvider.Model.CanUserAddStudents; 
            }
        }

        public bool CanUserRemoveStudents
        {
            get { return LinksProvider.Model.CurrentUser.AccountType.DeletePermission == true; }
        }

        public bool CanUserEditStudent
        {
            get { return LinksProvider.Model.CurrentUser.AccountType.EditStudentsPermission == true; }
        }

        //public IEnumerable<Student> GetStudentsWithFilter(string filter = null)
        //{
        //    var context = LinksProvider.Model.EntityContext;
        //    if (string.IsNullOrWhiteSpace(filter))
        //        return context.Students;
        //    var res = context.Students.ToList().Where(t => t.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1);
        //    // TODO: по идее так оптимальнее, но почему-то не работает
        //    //var res = context.Teachers.Where(s => SqlFunctions.CharIndex(s.Name, filter) != 0);
        //    return res;
        //}

        public IEnumerable<Student> GetStudentsWithFilter(string filter = "", bool isArhieved = false)
        {
            var teacher = LinksProvider.Model.CurrentUser.Teacher;
            if (LinksProvider.Model.IsSeeAll || teacher == null)
            {
                var context = LinksProvider.Model.EntityContext;
                IEnumerable<Student> res;
                if (string.IsNullOrWhiteSpace(filter))
                    res = context.Students.ToList().Where(t => t.IsArchieved == isArhieved);
                else
                    res = context.Students.ToList()
                            .Where(t =>t.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1 &&
                                    t.IsArchieved == isArhieved);
                // TODO: по идее так оптимальнее, но почему-то не работает
                //var res = context.Teachers.Where(s => SqlFunctions.CharIndex(s.Name, filter) != 0);
                return res;
            }
            else
            {
                var students = teacher.Classes.SelectMany(c => c.Students).ToList();
                IEnumerable<Student> res;
                if (string.IsNullOrWhiteSpace(filter))
                    res = students.Where(t => t.IsArchieved == isArhieved);
                else
                    res = students.Where(t => t.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) != -1 &&
                                    t.IsArchieved == isArhieved);
                return res;
            }
        }

        //public int? Gender
        //{
        //    get
        //    {
        //        if (Student.Gender == null)
        //            return null;
        //        if (Student.Gender.Value)
        //            return 1;
        //        else
        //            return 0;
        //    }
        //    set
        //    {
        //        if (value == 1)
        //            Student.Gender = true;
        //        else if (value == 0)
        //            Student.Gender = false;
        //    }
        //}

        public void AddStudent(Student student)
        {
            var context = LinksProvider.Model.EntityContext;
            context.Students.Add(student);
            context.SaveChanges();
        }

        public void RollbackStudent(Student student)
        {
            var context = LinksProvider.Model.EntityContext;
            context.Rollback(student);
        }

        public void SaveChanges()
        {
            LinksProvider.Model.EntityContext.SaveChanges();
        }

        public void DeleteStudent(Student student)
        {
            var context = LinksProvider.Model.EntityContext;
            context.Students.Remove(student);
            context.SaveChanges();
        }

    }
}
